// 给你一个字符串 s ，请你去除字符串中重复的字母，使得每个字母只出现一次。需保证 返回结果的字典序最小（要求不能打乱其他字符的相对位置）。

// 示例 1：

// 输入：s = "bcabc"
// 输出："abc"
// 示例 2：

// 输入：s = "cbacdcbc"
// 输出："acdb"

// 超出时间限制
// 将每个字符先找到
// 得到不重复的字符组成的字符串的全部集合
// 最后一一判断得到最小的序列字符串
var removeDuplicateLetters = function (s) {
  const map = new Map();
  for (const [index, char] of s.split("").entries()) {
    map.set(char, [...(map.get(char) || []), index]);
  }
  const entries = [...map.entries()];
  let chars = [];

  for (const entry of entries) {
    let _chars = [];
    const [char, idxs] = entry;
    for (const idx of idxs) {
      if (chars.length === 0) {
        _chars.push([[char, idx]]);
      } else {
        for (const _char of chars) {
          _chars.push([..._char, [char, idx]]);
        }
      }
    }
    chars = _chars;
  }
  chars = chars.map((char) => {
    return char
      .sort(([, idx], [, _idx]) => idx - _idx)
      .map(([char]) => char)
      .join("");
  });

  return chars.slice(1).reduce((ret, char) => {
    if (char < ret) return char;
    return ret;
  }, chars[0]);
};
const ans = removeDuplicateLetters("cbacdcbc");
console.log("ans: ", ans);
